home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtilities.lha / ATUtilities / ohelp.c < prev    next >
C/C++ Source or Header  |  2000-09-29  |  47KB  |  1,833 lines

  1. /* ******************************************************************* */
  2. /* **                                                               ** */
  3. /* **                     ATUtilities Online Help                   ** */
  4. /* **            Copright (C) 1993-1994 by Thomas Dreibholz         ** */
  5. /* **                      All rights reserved                      ** */
  6. /* **                                                               ** */
  7. /* ******************************************************************* */
  8.  
  9. #define PAGE_INDEX 1
  10. #define PAGE_TEXT  2
  11.  
  12. #define PAGE_MEMORY 5
  13.  
  14. #include "ATUtilities.h"
  15. /*
  16. #define CreateBoolGadget(win,x,y,w,h,text,id) CreateBoolToggleGadget(0,win,x,y,w,h,text,id)
  17. #define CreateMinGadget(win,x,y,w,h,text,id) CreateBoolToggleGadget(4,win,x,y,w,h,text,id)
  18. #define CreateMBoolGadget(win,x,y,w,h,text,id) CreateBoolToggleGadget(5,win,x,y,w,h,text,id)
  19. #define CreateNToggleGadget(win,x,y,w,h,text,id) CreateBoolToggleGadget(1,win,x,y,w,h,text,id)
  20. #define CreateSToggleGadget(win,x,y,w,h,text,id) CreateBoolToggleGadget(2,win,x,y,w,h,text,id)
  21. #define DrawCNTextBorder(win,x,y,w,h,text) DrawNTextBorder(win,x,y,w,h,text,1)
  22. #define DrawCPTextBorder(win,x,y,w,h,text) DrawPTextBorder(win,x,y,w,h,text,1)
  23. #define ScreenInformationBox(scr,t,a,b,c,d,i) InformationBox(scr,t,a,b,c,d,i)
  24. */
  25. extern struct Library *DiskfontBase;
  26.  
  27. /* feste Strukturen */
  28. UBYTE *PrefsName    = "AT:Prefs/OnlineHelp.prefs";
  29. UBYTE  st[]        = {0,1,3,4,7};
  30. UBYTE *Statistik[] = {"",
  31.                "Index",
  32.                "Text ",
  33.                "\x9b1;33;40m\x9b4;33;4mStatistik\x9b0;33;40m",
  34.                "\x9b4;33;40mSeitenübersicht\x9b0;33;40m",
  35.                "Seite      Offset     Länge      Typ       Titel",
  36.                " %03ld       %6lx     %5ld      %s     %s",
  37.                "\x9b4;33;40mBilderübersicht\x9b0;33;40m",
  38.                "Bild          Offset          Größe in Bytes",
  39.                "Anzahl der Seiten:       %3ld",
  40.                "Gesamter Text in KBytes: %3ld",
  41.                " %02ld           %6lx          Extern",
  42.                " %02ld           %6lx          %7ld",
  43.                "Anzahl der Bilder:               %2ld",
  44.                "Gesamter Bildbereich in KBytes: %3ld"};
  45.  
  46. struct TextAttr Opal=
  47. {
  48.  "opal.font",
  49.  9,
  50.  FS_NORMAL,
  51.  FPF_DISKFONT
  52. };
  53.  
  54. struct OHPrefs
  55. {
  56.  UBYTE Cache;
  57.  UBYTE Numbers;
  58.  UBYTE NumInput;
  59.  UBYTE IsPAL;
  60.  UBYTE Lace;
  61.  UBYTE Pad;
  62. };
  63.  
  64. struct Page
  65. {
  66.  UWORD Length;
  67.  UWORD Flags;
  68.  ULONG Offset;
  69.  ULONG TextOffset;
  70.  ULONG GadgetOffset;
  71.  ULONG MenuOffset;
  72.  ULONG PictureOffset;
  73. };
  74.  
  75. struct Pages
  76. {
  77.  struct Page Page[1000];
  78. };
  79.  
  80. #define POFFSET(x) hd->Pages->Page[x].PictureOffset
  81. #define MOFFSET(x) hd->Pages->Page[x].MenuOffset
  82. #define GOFFSET(x) hd->Pages->Page[x].GadgetOffset
  83. #define TOFFSET(x) hd->Pages->Page[x].TextOffset
  84. #define OFFSET(x) hd->Pages->Page[x].Offset
  85. #define LENGTH(x) hd->Pages->Page[x].Length
  86. #define FLAGS(x) hd->Pages->Page[x].Flags
  87.  
  88. struct HelpData
  89. {
  90.  UWORD              StartPage;
  91.  struct OHPrefs     OHPrefs;
  92.  struct Screen     *Screen;
  93.  struct Window     *MainWindow;
  94.  struct Window     *IndexWindow;
  95.  struct Window     *TextWindow;
  96.  UWORD              HelpScreenHeight;
  97.  UWORD              IndexWindowHeight;
  98.  UWORD              TextWindowHeight;
  99.  UWORD              GadWindowTop;
  100.  UWORD              PropGadgetHeight;
  101.  UWORD              GadEnd;
  102.  ULONG              ViewModes;
  103.  struct MenuStrip  *MenuStrip;
  104.  struct Menu       *DateiMenu;
  105.  struct Menu       *QVMenu;
  106.  struct Menu       *BilderMenu;
  107.  struct Window     *GadWindow;
  108.  struct Gadget     *PropGadget;
  109.  struct PropInfo   *PropInfo;
  110.  struct RastPort   *MainRastPort;
  111.  struct RastPort   *IndexRastPort;
  112.  struct RastPort   *TextRastPort;
  113.  struct MsgPort    *MainUserPort;
  114.  struct MsgPort    *IndexUserPort;
  115.  struct MsgPort    *TextUserPort;
  116.  struct MsgPort    *GadUserPort;
  117.  struct TextFont   *OpalFont;
  118.  struct ViewPort   *ViewPort;
  119.  struct MsgPort    *ConPort;
  120.  struct IOStdReq   *ConReq;
  121.  LONG               ConDev;
  122.  struct FileHandle *HelpFile;
  123.  UBYTE             *Memory;
  124.  struct Pages      *Pages;
  125.  ULONG              Picture[100];
  126.  UWORD              Page;
  127.  UWORD              Loaded;
  128.  UWORD              Flags;
  129.  ULONG              MainWindowSM;
  130.  ULONG              IndexWindowSM;
  131.  ULONG              TextWindowSM;
  132.  ULONG              GadWindowSM;
  133.  ULONG              WaitSM;
  134.  UWORD              NextPage[4];
  135.  
  136.  UWORD              LastPage[PAGE_MEMORY+1];
  137.  UBYTE              LastPagePos;
  138.  UBYTE              LastPageSelect;
  139.  UWORD              ShowLastPageBack;
  140.  
  141.  UBYTE              String[264];
  142.  
  143.  BOOL               IsNTSC;
  144.  UWORD              Rows;
  145.  UWORD              ListRows;
  146.  UWORD              MaxItems;
  147.  
  148.  UWORD              PropDown;
  149.  
  150.  UWORD              CacheOn;
  151.  ULONG              CacheSize;
  152.  LONG               CachePos;
  153.  LONG               CacheLastPos;
  154.  UBYTE             *CacheMemory;
  155.  
  156.  UBYTE              InputCount;
  157.  UWORD              Input[3];
  158.  
  159.  UWORD              IGy;
  160.  UWORD              IGw;
  161.  UWORD              IGs;
  162.  UWORD              IGPCount;
  163.  struct Gadget     *IndexGadgets[64];
  164.  UWORD              IndexGadgetPages[64];
  165.  
  166.  UWORD              MenuPageCount;
  167.  UWORD              MenuNames[25][62];
  168.  UWORD              MenuPages[25];
  169.  
  170.  UBYTE              MenuPicCount;
  171.  UBYTE              MenuPicNames[25][16];
  172.  UBYTE              MenuPics[25];
  173.  
  174.  UWORD              PropBody;
  175.  UWORD              LineCount;
  176.  UWORD              CurrentLine;
  177.  UBYTE             *Lines[2000];
  178.  
  179.  UWORD              OutputPos;
  180. };
  181.  
  182. UWORD Colors[]={0x97a,0x222,0xddd,0xff5,0xdff,0xe0e,0xf03,0x00f};
  183.  
  184. BOOL OpenHelp();
  185. VOID CloseHelp();
  186. VOID ConWrite();
  187. VOID RefreshGadWindow();
  188. VOID GetTitle();
  189. VOID LoadPage();
  190. VOID ShowIndexPage();
  191. VOID ShowTextPage();
  192. VOID RemIndexGadgets();
  193. VOID NewProp();
  194. VOID ShowPart();
  195. VOID MakeMenu();
  196. VOID SpecialPage();
  197. VOID GetPictures();
  198. VOID GetItems();
  199. VOID Prefs();
  200. LONG CacheRead();
  201. LONG CacheSeek();
  202. VOID LoadAPicture();
  203. VOID AddPage();
  204.  
  205.  
  206. /* Informationen anzeigen */
  207. struct InfoItem ii1=
  208. {
  209.  0,0
  210. };
  211.  
  212. struct InfoItem ii2=
  213. {
  214.  1,1,
  215.  "Service",
  216.  "Haben Sie Anregungen oder",
  217.  "Verbesserungswünsche?",
  218.  "",
  219.  "Senden Sie eine PM (Persönliche Mitteilung)",
  220.  "an T.DREIBHOLZ in folgenden Mailboxen:",
  221.  "",
  222.  "Carrier: 02261/75835",
  223.  "Apogee: 02262/68614",
  224.  "",
  225.  "oder schreiben Sie an:",
  226.  "",
  227.  "Thomas Dreibholz",
  228.  "Molbachweg 7",
  229.  "D-51674 Wiehl"
  230. };
  231.  
  232. struct Info info=
  233. {
  234.  2,
  235.  &ii1,
  236.  &ii2
  237. };
  238.  
  239. VOID ShowInfo(win,scr)
  240.  struct Window *win;
  241.  struct Screen *scr;
  242. {
  243.  ExtInformationBox(scr,
  244.                    "ATUtilities Online Help - Information",
  245.                    "$VER: Online Help - Version 4.0",
  246.                    "Copyright (C) 1993-1994 by",
  247.                    "Thomas Dreibholz",
  248.                    "All rights reserved.",
  249.                    "AT:Icons/Help",
  250.                    &info);
  251.  ActivateWindow(win);
  252. }
  253.  
  254.  
  255. /* Online-Hilfe-Funktion */
  256. VOID Help(name,seite)
  257.  UBYTE *name;
  258.  UWORD  seite;
  259. {
  260.  UBYTE                         s[32];
  261.  REGISTER ULONG                Class;
  262.  REGISTER BOOL                 ende,bool;
  263.  REGISTER UWORD                i,j,Code;
  264.  REGISTER UWORD                MenuNum,ItemNum;
  265.  REGISTER ULONG                Signale;
  266.  register struct IntuiMessage *msg;
  267.  register struct HelpData     *hd;
  268.  register struct Gadget       *gad;
  269.  
  270.  if(DiskfontBase==NULL)
  271.   {
  272.    InfoRequest("Keine Diskfont-Library!");
  273.    return;
  274.   }
  275.  
  276.  hd=AllocMem(sizeof(struct HelpData),MEMF_CLEAR|MEMF_PUBLIC);
  277.  if(hd==NULL)
  278.   {
  279.    ErrorRequest(ERROR_ALLOC);
  280.    return;
  281.   }
  282.  hd->StartPage=seite;
  283.  
  284.  bool=OpenHelp(hd,name);
  285.  if(bool==TRUE)
  286.   {
  287.    ende=FALSE;
  288.    while(ende==FALSE)
  289.     {
  290.      Signale=Wait(hd->WaitSM);
  291.      if((hd->GadUserPort!=NULL) && (Signale & hd->GadWindowSM))
  292.       {
  293.        msg=GetMsg(hd->GadUserPort);
  294.        while(msg!=NULL)
  295.         {
  296.          Class=msg->Class;
  297.          gad=msg->IAddress;
  298.          ReplyMsg(msg);
  299.          if(Class==GADGETUP)
  300.           {
  301.            j=gad->GadgetID;
  302.            switch(j)
  303.             {
  304.              case 1000:
  305.                if(hd->LastPageSelect>0)
  306.                 {
  307.                  if(!(hd->Page==1001))
  308.                   {
  309.                    hd->LastPageSelect--;
  310.                    hd->ShowLastPageBack++;
  311.                   }
  312.                  LoadPage(hd,hd->LastPage[hd->LastPageSelect],FALSE);
  313.                 }
  314.               break;
  315.              case 2000:
  316.                if(hd->ShowLastPageBack>0)
  317.                 {
  318.                  hd->ShowLastPageBack--;
  319.                  hd->LastPageSelect++;
  320.                  LoadPage(hd,hd->LastPage[hd->LastPageSelect],FALSE);
  321.                 }
  322.               break;
  323.              case 3000:
  324.                LoadPage(hd,hd->Loaded,FALSE);
  325.               break;
  326.              default:
  327.                LoadPage(hd,hd->NextPage[j],TRUE);
  328.               break;
  329.             }
  330.           }
  331.          else if(Class==ACTIVEWINDOW)
  332.            ActivateWindow(hd->MainWindow);
  333.          msg=GetMsg(hd->GadUserPort);
  334.         }
  335.       }
  336.      if(Signale & hd->MainWindowSM)
  337.       {
  338.        msg=GetMsg(hd->MainUserPort);
  339.        while(msg!=NULL)
  340.         {
  341.          Class=msg->Class;
  342.          Code=msg->Code;
  343.          gad=msg->IAddress;
  344.          ReplyMsg(msg);
  345.          switch(Class)
  346.           {
  347.            case GADGETUP:
  348.             j=gad->GadgetID;
  349.             switch(j)
  350.              {
  351.               case 1:
  352.                 ende=TRUE;
  353.                break;
  354.               case 2:
  355.                 LoadPage(hd,0,TRUE);
  356.                break;
  357.               case 3:
  358.                 if((hd->Flags==PAGE_TEXT)&&(hd->LineCount>hd->Rows))
  359.                  {
  360.                   hd->PropDown=0;
  361.                   j=hd->PropInfo->VertPot/(65535/hd->PropBody);
  362.                   ShowPart(hd,j);
  363.                  }
  364.                break;
  365.              }
  366.             break;
  367.            case GADGETDOWN:
  368.             j=gad->GadgetID;
  369.             switch(j)
  370.              {
  371.               case 3:
  372.                 if((hd->Flags==PAGE_TEXT)&&(hd->LineCount>hd->Rows))
  373.                  {
  374.                   hd->PropDown=1;
  375.                  }
  376.                break;
  377.              }
  378.             break;
  379.            case MOUSEMOVE:
  380.              if(hd->PropDown!=0)
  381.               {
  382.                AbortIO(hd->ConReq);
  383.                j=hd->PropInfo->VertPot/(65535/hd->PropBody);
  384.                ShowPart(hd,j);
  385.               }
  386.             break;
  387.            case MENUPICK:
  388.              MenuNum=MENUNUM(Code);
  389.              ItemNum=ITEMNUM(Code);
  390.              switch(MenuNum)
  391.               {
  392.                case 2:
  393.                  switch(ItemNum)
  394.                   {
  395.                    case 0:
  396.                      ende=TRUE;
  397.                     break;
  398.                    case 2:
  399.                      ShowInfo(hd->MainWindow,hd->Screen);
  400.                     break;
  401.                    case 4:
  402.                      SpecialPage(hd,1);
  403.                     break;
  404.                    case 5:
  405.                      SpecialPage(hd,2);
  406.                     break;
  407.                    case 6:
  408.                      SpecialPage(hd,3);
  409.                     break;
  410.                    case 8:
  411.                      Prefs(hd);
  412.                     break;
  413.                   }
  414.                 break;
  415.                case 1:
  416.                  if((hd->MenuPageCount!=0)&&(ItemNum<=hd->MenuPageCount))
  417.                    LoadPage(hd,hd->MenuPages[hd->MenuPageCount-ItemNum-1],TRUE);
  418.                 break;
  419.                case 0:
  420.                  if((hd->MenuPicCount!=0)&&(ItemNum<=hd->MenuPicCount))
  421.                    LoadAPicture(hd,hd->MenuPics[hd->MenuPicCount-ItemNum-1]);
  422.                  ActivateWindow(hd->MainWindow);
  423.                 break;
  424.               }
  425.             break;
  426.            case VANILLAKEY:
  427.              if(hd->OHPrefs.NumInput)
  428.               {
  429.                if((Code>='0')&&(Code<='9'))
  430.                 {
  431.                  hd->Input[hd->InputCount]=Code;
  432.                  hd->InputCount++;
  433.                  sprintf(&s,"Seiteneingabe: #%c%c%c",hd->Input[0],
  434.                                                      hd->Input[1],
  435.                                                      hd->Input[2]);
  436.                  DrawCNTextBorder(hd->MainWindow,320,10,310,12,&s);
  437.                  if(hd->InputCount>2)
  438.                   {
  439.                    LoadPage(hd,(hd->Input[0]-48)*100+
  440.                                (hd->Input[1]-48)*10+
  441.                                (hd->Input[2]-48),TRUE);
  442.                   }
  443.                 }
  444.               }
  445.             break;
  446.           }
  447.          msg=GetMsg(hd->MainUserPort);
  448.         }
  449.       }
  450.      if(Signale & hd->IndexWindowSM)
  451.       {
  452.        msg=GetMsg(hd->IndexUserPort);
  453.        while(msg!=NULL)
  454.         {
  455.          Class=msg->Class;
  456.          gad=msg->IAddress;
  457.          ReplyMsg(msg);
  458.          if(Class==GADGETUP)
  459.           {
  460.            j=gad->GadgetID;
  461.            LoadPage(hd,hd->IndexGadgetPages[j],TRUE);
  462.           }
  463.          else if(Class==ACTIVEWINDOW)
  464.            ActivateWindow(hd->MainWindow);
  465.          msg=GetMsg(hd->IndexUserPort);
  466.         }
  467.       }
  468.      if(Signale & hd->TextWindowSM)
  469.       {
  470.        msg=GetMsg(hd->TextUserPort);
  471.        while(msg!=NULL)
  472.         {
  473.          Class=msg->Class;
  474.          ReplyMsg(msg);
  475.          if(Class==ACTIVEWINDOW)
  476.            ActivateWindow(hd->MainWindow);
  477.          msg=GetMsg(hd->TextUserPort);
  478.         }
  479.       }
  480.     }
  481.   }
  482.  WBenchToFront();
  483.  CloseHelp(hd);
  484.  FreeMem(hd,sizeof(struct HelpData));
  485. }
  486.  
  487.  
  488. /* Hilfe starten */
  489. BOOL OpenHelp(hd,name)
  490.  struct HelpData *hd;
  491.  UBYTE           *name;
  492. {
  493.  register struct FileHandle *fh;
  494.  UBYTE                       c,id[8];
  495.  WORD                        a,i;
  496.  LONG                        b;
  497.  
  498.  hd->ConDev=-1L;
  499.  
  500.  hd->HelpFile=Open(name,MODE_OLDFILE);
  501.  if(hd->HelpFile==NULL)
  502.   {
  503.    MultiRequest("Kann Hilfedatei nicht öffnen:",name,"Okay",NULL);
  504.    return(FALSE);
  505.   }
  506.  
  507.  Read(hd->HelpFile,&id,8);
  508.  if(strncmp(&id,"HELP_2.0",8))
  509.   {
  510.    InfoRequest("Hilfedatei hat kein HELP_2.0-Format!");
  511.    return(FALSE);
  512.   }
  513.  
  514.  hd->OpalFont=GetOpalFont();
  515.  
  516.  fh=Open(PrefsName,MODE_OLDFILE);
  517.  if(fh!=NULL)
  518.   {
  519.    Read(fh,&hd->OHPrefs,sizeof(struct OHPrefs));
  520.    Close(fh);
  521.   }
  522.  
  523.  if(hd->OHPrefs.Lace==0)
  524.    hd->ViewModes=HIRES;
  525.  else
  526.   {
  527.    hd->ViewModes=HIRES|LACE;
  528.    hd->ListRows=16;
  529.   }
  530.  if(hd->OHPrefs.IsPAL==0)
  531.   {
  532.    hd->IsNTSC=TRUE;
  533.    hd->ListRows=18;
  534.    if(hd->OHPrefs.Lace==0)
  535.     {
  536.      hd->ListRows=hd->Rows=18;
  537.      hd->MaxItems=18;
  538.      hd->GadWindowTop=182;
  539.      hd->HelpScreenHeight=200;
  540.      hd->IndexWindowHeight=154;
  541.     }
  542.    else
  543.     {
  544.      hd->Rows=43;
  545.      hd->MaxItems=24;
  546.      hd->GadWindowTop=382;
  547.      hd->HelpScreenHeight=400;
  548.      hd->IndexWindowHeight=354;
  549.     }
  550.   }
  551.  else
  552.   {
  553.    hd->IsNTSC=FALSE;
  554.    if(hd->OHPrefs.Lace==0)
  555.     {
  556.      hd->ListRows=hd->Rows=25;
  557.      hd->MaxItems=24;
  558.      hd->GadWindowTop=238;
  559.      hd->HelpScreenHeight=256;
  560.      hd->IndexWindowHeight=210;
  561.     }
  562.    else
  563.     {
  564.      hd->Rows=57;
  565.      hd->MaxItems=24;
  566.      hd->GadWindowTop=494;
  567.      hd->HelpScreenHeight=512;
  568.      hd->IndexWindowHeight=466;
  569.     }
  570.   }
  571.  hd->GadEnd=hd->IndexWindowHeight-12;
  572.  hd->TextWindowHeight=hd->IndexWindowHeight-1;
  573.  hd->PropGadgetHeight=hd->IndexWindowHeight+1;
  574.  
  575.  hd->Screen=CreateScreen(0L,640,hd->HelpScreenHeight,3,hd->ViewModes);
  576.  if(hd->Screen==NULL)
  577.   {
  578.    InfoRequest("Kann Screen nicht öffnen!");
  579.    return(FALSE);
  580.   }
  581.  
  582.  hd->ViewPort=&hd->Screen->ViewPort;
  583.  LoadRGB4(hd->ViewPort,&Colors,8);
  584.  
  585.  hd->IndexWindow=CreateWindow(hd->Screen,0L,
  586.                               11,26,582,hd->IndexWindowHeight,
  587.                               GADGETUP|ACTIVEWINDOW,
  588.                               BORDERLESS);
  589.  if(hd->IndexWindow==NULL)
  590.   {
  591.    InfoRequest("Kann Fenster nicht öffnen!");
  592.    return(FALSE);
  593.   }
  594.  
  595.  hd->TextWindow=CreateWindow(hd->Screen,0L,
  596.                              12,27,580,hd->TextWindowHeight,
  597.                              ACTIVEWINDOW,
  598.                              NOCAREREFRESH|BORDERLESS);
  599.  if(hd->TextWindow==NULL)
  600.   {
  601.    InfoRequest("Kann Fenster nicht öffnen!");
  602.    return(FALSE);
  603.   }
  604.  
  605.  hd->MainWindow=CreateWindow(hd->Screen,0L,
  606.                              0,0,640,hd->HelpScreenHeight,
  607.                              GADGETUP|MENUPICK|GADGETDOWN|MOUSEMOVE|VANILLAKEY,
  608.                              ACTIVATE|BORDERLESS);
  609.  if(hd->MainWindow==NULL)
  610.   {
  611.    InfoRequest("Kann Fenster nicht öffnen!");
  612.    return(FALSE);
  613.   }
  614.  
  615.  hd->MainWindow->BlockPen=2;
  616.  hd->MainRastPort=hd->MainWindow->RPort;
  617.  hd->IndexRastPort=hd->IndexWindow->RPort;
  618.  hd->TextRastPort=hd->TextWindow->RPort;
  619.  hd->MainUserPort=hd->MainWindow->UserPort;
  620.  hd->IndexUserPort=hd->IndexWindow->UserPort;
  621.  hd->TextUserPort=hd->TextWindow->UserPort;
  622.  hd->MainWindowSM=(1L<<hd->MainUserPort->mp_SigBit);
  623.  hd->IndexWindowSM=(1L<<hd->IndexUserPort->mp_SigBit);
  624.  hd->TextWindowSM=(1L<<hd->TextUserPort->mp_SigBit);
  625.  hd->MainWindow->UserData=NULL;
  626.  hd->IndexWindow->UserData=NULL;
  627.  hd->TextWindow->UserData=NULL;
  628.  
  629.  SetFont(hd->MainRastPort,hd->OpalFont);
  630.  SetFont(hd->IndexRastPort,hd->OpalFont);
  631.  
  632.  CreateBoolGadget(hd->MainWindow,10,10,150,12,"Ende",1);
  633.  CreateBoolGadget(hd->MainWindow,165,10,150,12,"Index",2);
  634.  hd->PropGadget=CreatePropGadget(hd->MainWindow,600,25,30,hd->PropGadgetHeight,0,0,0,65535,3);
  635.  hd->PropInfo=hd->PropGadget->SpecialInfo;
  636.  DrawNBorder(hd->MainWindow,10,25,584,hd->PropGadgetHeight,0);
  637.  
  638.  SetAPen(hd->MainRastPort,3);
  639.  WriteText(hd->MainRastPort,40,40,"ATUtilities Online-Hilfe - Version 4.0");
  640.  WriteText(hd->MainRastPort,40,60,"Hilfedatei wird bearbeitet.");
  641.  WriteText(hd->MainRastPort,40,80,"Bitte warten...");
  642.  
  643.  hd->ConPort=CreatePort("onlinehelp-console.port",0L);
  644.  if(hd->ConPort==NULL)
  645.   {
  646.    InfoRequest("Kann MsgPort nicht erstellen!");
  647.    return(FALSE);
  648.   }
  649.  
  650.  hd->ConReq=CreateExtIO(hd->ConPort,sizeof(struct IOStdReq));
  651.  if(hd->ConReq==NULL)
  652.   {
  653.    InfoRequest("Kann IOStdReq nicht erstellen!");
  654.    return(FALSE);
  655.   }
  656.  
  657.  hd->ConReq->io_Data=hd->TextWindow;
  658.  hd->ConReq->io_Length=sizeof(struct Window);
  659.  
  660.  hd->ConDev=OpenDevice("console.device",0L,hd->ConReq,0L);
  661.  if(hd->ConDev!=0)
  662.   {
  663.    InfoRequest("Kann Console-Device nicht öffnen!");
  664.    return(FALSE);
  665.   }
  666.  ConWrite(hd,"\x9b0;33;40m");
  667.  
  668.  if(hd->OHPrefs.Cache!=0)
  669.   {
  670.    Seek(hd->HelpFile,0,OFFSET_END);
  671.    hd->CacheSize=Seek(hd->HelpFile,0,OFFSET_BEGINNING);
  672.    hd->CacheMemory=AllocMem(hd->CacheSize,MEMF_CLEAR|MEMF_PUBLIC);
  673.    if(hd->CacheMemory!=NULL)
  674.     {
  675.      b=Read(hd->HelpFile,hd->CacheMemory,hd->CacheSize);
  676.      if(b==hd->CacheSize) hd->CacheOn=1;
  677.     }
  678.   }
  679.  
  680.  hd->Pages=AllocMem(sizeof(struct Pages),MEMF_CLEAR|MEMF_PUBLIC);
  681.  if(hd->Pages==NULL)
  682.   {
  683.    ErrorRequest(ERROR_ALLOC);
  684.    return(FALSE);
  685.   }
  686.  
  687.  hd->Memory=AllocMem(50000,MEMF_CLEAR|MEMF_PUBLIC);
  688.  if(hd->Memory==NULL)
  689.   {
  690.    ErrorRequest(ERROR_ALLOC);
  691.    return(FALSE);
  692.   }
  693.  
  694.  CacheSeek(hd,-4,OFFSET_END);
  695.  CacheRead(hd,&b,4L);
  696.  CacheSeek(hd,b,OFFSET_BEGINNING);
  697.  for(i=0;i<1000;i++)
  698.   {
  699.    CacheRead(hd,&c,1L);
  700.    if(c!=0)
  701.     {
  702.      CacheRead(hd,&a,2L);
  703.      CacheRead(hd,&b,4L);
  704.      LENGTH(i)=a;
  705.      OFFSET(i)=b;
  706.      FLAGS(i)=c;
  707.      CacheRead(hd,&b,4L);
  708.      TOFFSET(i)=b;
  709.      CacheRead(hd,&b,4L);
  710.      GOFFSET(i)=b;
  711.      CacheRead(hd,&b,4L);
  712.      MOFFSET(i)=b;
  713.      CacheRead(hd,&b,4L);
  714.      POFFSET(i)=b;
  715.     }
  716.   }
  717.  for(i=0;i<100;i++)
  718.   {
  719.    CacheRead(hd,&hd->Picture[i],4L);
  720.   }
  721.  
  722.  if(OFFSET(hd->StartPage)==0)
  723.   {
  724.    MultiRequest("Angegebene Startseite existiert nicht!",
  725.                 "Hauptindex wird als Ersatz angezeigt.",
  726.                 "Okay",NULL);
  727.    hd->StartPage=0;
  728.   }
  729.  
  730.  hd->MenuStrip=BuildMenuStrip(hd->MainWindow,7,AUTOBACKPEN);
  731.  if(hd->MenuStrip==NULL)
  732.   {
  733.    InfoRequest("Kein Speicher für Menu!");
  734.    return(FALSE);
  735.   }
  736.  
  737.  hd->Page=12345;
  738.  LoadPage(hd,hd->StartPage,TRUE);
  739.  return(TRUE);
  740. }
  741.  
  742.  
  743. /* Hilfe beenden */
  744. VOID CloseHelp(hd)
  745.  struct HelpData *hd;
  746. {
  747.  
  748.  if(hd->MenuStrip) RemoveMenuStrip(hd->MenuStrip,TRUE);
  749.  if(hd->ConDev==0) CloseDevice(hd->ConReq);
  750.  if(hd->GadWindow) DeleteStdWindow(hd->GadWindow);
  751.  if(hd->TextWindow) DeleteStdWindow(hd->TextWindow);
  752.  if(hd->IndexWindow)
  753.   {
  754.    RemIndexGadgets(hd);
  755.    DeleteStdWindow(hd->IndexWindow);
  756.   }
  757.  if(hd->MainWindow) DeleteStdWindow(hd->MainWindow);
  758.  if(hd->Screen) CloseScreen(hd->Screen);
  759.  if(hd->ConReq) DeleteExtIO(hd->ConReq);
  760.  if(hd->ConPort) DeletePort(hd->ConPort);
  761.  if(hd->Pages) FreeMem(hd->Pages,sizeof(struct Pages));
  762.  if(hd->Memory) FreeMem(hd->Memory,50000);
  763.  if(hd->CacheMemory) FreeMem(hd->CacheMemory,hd->CacheSize);
  764.  if(hd->HelpFile) Close(hd->HelpFile);
  765. }
  766.  
  767.  
  768. /* Text im Console-Display ausgeben */
  769. VOID ConWrite(hd,text)
  770.  struct HelpData *hd;
  771.  UBYTE           *text;
  772. {
  773.  hd->ConReq->io_Data=text;
  774.  hd->ConReq->io_Length=strlen(text);
  775.  hd->ConReq->io_Command=CMD_WRITE;
  776.  SendIO(hd->ConReq);
  777. }
  778.  
  779.  
  780. /* Gadget-Fenster erstellen */
  781. VOID RefreshGadWindow(hd,title)
  782.  struct HelpData *hd;
  783.  BOOL             title;
  784. {
  785.  REGISTER WORD i;
  786.  
  787.  if(hd->GadWindow!=NULL)
  788.    DeleteStdWindow(hd->GadWindow);
  789.  
  790.  if(title==TRUE)
  791.   {
  792.    GetTitle(hd,hd->Page);
  793.    DrawMNTextBorder(hd->MainWindow,320,10,310,12,&hd->String);
  794.   }
  795.  
  796.  hd->GadWindow=CreateWindow(hd->Screen,0L,
  797.                             0,hd->GadWindowTop,640,15,
  798.                             GADGETUP|ACTIVEWINDOW,
  799.                             BORDERLESS);
  800.  if(hd->GadWindow!=NULL)
  801.   {
  802.    SetFont(hd->GadWindow->RPort,hd->OpalFont);
  803.    hd->GadUserPort=hd->GadWindow->UserPort;
  804.    hd->GadWindowSM=(1L<<hd->GadUserPort->mp_SigBit);
  805.    for(i=0;i<=3;i++) hd->NextPage[i]=0xFFFF;
  806.  
  807.    if(hd->Page!=1001)
  808.     {
  809.  
  810.      if(hd->Page>0)
  811.       {
  812.        for(i=(hd->Page-1);i>=0;i--)
  813.          if(FLAGS(i)==PAGE_INDEX)
  814.           { hd->NextPage[0]=i; break; }
  815.       }
  816.  
  817.      if(hd->Page!=0) hd->NextPage[3]=0;
  818.      if(hd->Page<999)
  819.       {
  820.        for(i=(hd->Page+1);i<=999;i++)
  821.          if(FLAGS(i)==PAGE_INDEX)
  822.           { hd->NextPage[3]=i; break; }
  823.       }
  824.  
  825.      if((hd->Page>0)&&(hd->Flags==PAGE_TEXT))
  826.       {
  827.        for(i=(hd->Page-1);i>=0;i--)
  828.         {
  829.          if(OFFSET(i)!=0)
  830.           {
  831.            if(FLAGS(i)==PAGE_TEXT)
  832.              hd->NextPage[1]=i;
  833.            break;
  834.           }
  835.         }
  836.       }
  837.  
  838.      if(hd->Page<999)
  839.       {
  840.        for(i=(hd->Page+1);i<=999;i++)
  841.         {
  842.          if(OFFSET(i)!=0)
  843.           {
  844.            if(FLAGS(i)==PAGE_TEXT)
  845.              hd->NextPage[2]=i;
  846.            break;
  847.           }
  848.         }
  849.       }
  850.  
  851.      for(i=0;i<=3;i++)
  852.       {
  853.        if(hd->NextPage[i]!=0xFFFF)
  854.         {
  855.          GetTitle(hd,hd->NextPage[i]);
  856.          CreateMBoolGadget(hd->GadWindow,38+(i*143),1,135,12,&hd->String,i);
  857.         }
  858.       }
  859.  
  860.      if(hd->LastPageSelect>0)
  861.        CreateBoolGadget(hd->GadWindow,10,1,22,12,"«",1000);
  862.      if(hd->ShowLastPageBack>0)
  863.        CreateBoolGadget(hd->GadWindow,608,1,22,12,"»",2000);
  864.     }
  865.    else
  866.     {
  867.      GetTitle(hd,hd->Loaded);
  868.      CreateMBoolGadget(hd->GadWindow,10,1,620,12,&hd->String,3000);
  869.     }
  870.   }
  871.  else
  872.   {
  873.  
  874.    DisplayBeep(NULL);
  875.    DisplayBeep(NULL);
  876.    DisplayBeep(NULL);
  877.    DisplayBeep(NULL);
  878.  
  879.    hd->GadWindowSM=0;
  880.    hd->GadUserPort=NULL;
  881.   }
  882.  hd->WaitSM=hd->GadWindowSM+hd->MainWindowSM+hd->IndexWindowSM+hd->TextWindowSM;
  883. }
  884.  
  885.  
  886. /* Titel einer Seite ermitteln */
  887. VOID GetTitle(hd,p)
  888.  struct HelpData *hd;
  889.  LONG             p;
  890. {
  891.  ULONG i,o;
  892.  
  893.  i=OFFSET(p);
  894.  if(i!=0)
  895.   {
  896.    o=CacheSeek(hd,i,OFFSET_BEGINNING);
  897.    if(hd->OHPrefs.Numbers==0)
  898.     {
  899.      CacheRead(hd,&hd->String,256L);
  900.     }
  901.    else
  902.     {
  903.      sprintf(&hd->String,"#%03ld: ",p);
  904.      CacheRead(hd,&hd->String[6],256L);
  905.     }
  906.    CacheSeek(hd,o,OFFSET_BEGINNING);
  907.   }
  908.  else hd->String[0]=0x00;
  909. }
  910.  
  911.  
  912. /* Seite anzeigen */
  913. VOID LoadPage(hd,num,add)
  914.  struct HelpData *hd;
  915.  UWORD            num;
  916.  BOOL             add;
  917. {
  918.  
  919.  hd->InputCount=0;
  920.  hd->Input[1]='-';
  921.  hd->Input[2]='-';
  922.  if(num==hd->Page) return;
  923.  if(OFFSET(num)!=0)
  924.   {
  925.    hd->Page=num;
  926.    hd->Loaded=num;
  927.    hd->Flags=FLAGS(num);
  928.    if(add==TRUE) AddPage(hd);
  929.    ClearMenuStrip(hd->MainWindow);
  930.    RemIndexGadgets(hd);
  931.    switch(hd->Flags)
  932.     {
  933.      case PAGE_INDEX:
  934.        NewProp(hd,1);
  935.        ShowIndexPage(hd,num);
  936.       break;
  937.      case PAGE_TEXT:
  938.        ShowTextPage(hd,num);
  939.       break;
  940.     }
  941.   }
  942.  else
  943.   {
  944.    DisplayBeep(hd->Screen);
  945.    DisplayBeep(hd->Screen);
  946.   }
  947. }
  948.  
  949.  
  950. /* Indexseite anzeigen */
  951. VOID ShowIndexPage(hd,num)
  952.  struct HelpData *hd;
  953.  UWORD            num;
  954. {
  955.  UBYTE         *m;
  956.  REGISTER LONG  i,j;
  957.  REGISTER UWORD x,y,w;
  958.  REGISTER UBYTE c;
  959.  UWORD          wort;
  960.  
  961.  x=15; y=11;
  962.  j=TOFFSET(num);
  963.  if(j!=0)
  964.   {
  965.    i=LENGTH(num);
  966.    CacheSeek(hd,j,OFFSET_BEGINNING);
  967.    CacheRead(hd,hd->Memory,i);
  968.  
  969.  /* ----- Testausgabe -------------------------------------------------- */
  970.    SetAPen(hd->IndexRastPort,3);
  971.    m=hd->Memory;
  972.    for(j=0;j<i;j++)
  973.     {
  974.      c=m[j];
  975.      if(c==0x00)
  976.       {
  977.        x=15;
  978.        y+=10;
  979.       }
  980.      else
  981.       {
  982.        Move(hd->IndexRastPort,x,y);
  983.        Text(hd->IndexRastPort,&c,1L);
  984.        x=x+TextLength(hd->IndexRastPort,&c,1L);
  985.       }
  986.     }
  987.   }
  988.  
  989.  /* ----- Gadgets ------------------------------------------------------ */
  990.  j=GOFFSET(num);
  991.  if(j!=0)
  992.   {
  993.    CacheSeek(hd,j,OFFSET_BEGINNING);
  994.    j=0; y-=5;
  995.    CacheRead(hd,&wort,2L);
  996.    while((wort!=0xFFFF)&&(j<=63))
  997.     {
  998.      hd->IndexGadgetPages[j]=wort;
  999.      j++;
  1000.      CacheRead(hd,&wort,2L);
  1001.     }
  1002.    hd->IGPCount=j;
  1003.  
  1004.    hd->IGy=(hd->GadEnd-y)/27;
  1005.    if(hd->IGy==0) hd->IGy=1;
  1006.    hd->IGs=hd->IGPCount/hd->IGy;
  1007.    if(hd->IGs==0) hd->IGs=1;
  1008.    hd->IGw=((552-((hd->IGs-1)*5))/hd->IGs);
  1009.  
  1010.    x=15;
  1011.    for(i=0;i<hd->IGPCount;i++)
  1012.     {
  1013.      if(hd->IndexGadgetPages[i]!=2000)
  1014.       {
  1015.        GetTitle(hd,hd->IndexGadgetPages[i]);
  1016.        hd->IndexGadgets[i]=CreateMBoolGadget(hd->IndexWindow,x,y,hd->IGw,12,&hd->String,i);
  1017.        x+=hd->IGw+5;
  1018.        if(x>550) { x=15; y+=15; }
  1019.       }
  1020.      else
  1021.       {
  1022.        if(x>15)
  1023.         {
  1024.          x=15; y+=15;
  1025.         }
  1026.        y+=10;
  1027.       }
  1028.     }
  1029.   }
  1030.  else hd->IGPCount=0;
  1031.  
  1032.  /* ----- GadWindow und Menüs erstellen -------------------------------- */
  1033.  
  1034.  WindowToFront(hd->IndexWindow);
  1035.  
  1036.  RefreshGadWindow(hd,TRUE);
  1037.  GetItems(hd,num);
  1038.  GetPictures(hd,num);
  1039.  MakeMenu(hd);
  1040. }
  1041.  
  1042.  
  1043. /* Bilder laden */
  1044. VOID GetPictures(hd,num)
  1045.  struct HelpData *hd;
  1046.  UWORD            num;
  1047. {
  1048.  UBYTE          byte;
  1049.  REGISTER ULONG o;
  1050.  
  1051.  hd->MenuPicCount=0;
  1052.  o=POFFSET(num);
  1053.  if(o!=0)
  1054.   {
  1055.    CacheSeek(hd,o,OFFSET_BEGINNING);
  1056.    CacheRead(hd,&byte,1L);
  1057.    while((byte!=0xFF)&&(hd->MenuPicCount<=hd->MaxItems))
  1058.     {
  1059.      hd->MenuPics[hd->MenuPicCount]=byte;
  1060.      hd->MenuPicCount++;
  1061.      CacheRead(hd,&byte,1L);
  1062.     }
  1063.   }
  1064. }
  1065.  
  1066.  
  1067. /* Menü-Items laden */
  1068. VOID GetItems(hd,num)
  1069.  struct HelpData *hd;
  1070.  UWORD            num;
  1071. {
  1072.  UWORD          wort;
  1073.  REGISTER UWORD i,j;
  1074.  REGISTER ULONG o;
  1075.  
  1076.  hd->MenuPageCount=0;
  1077.  o=MOFFSET(num);
  1078.  if(o!=0)
  1079.   {
  1080.    CacheSeek(hd,o,OFFSET_BEGINNING);
  1081.    CacheRead(hd,&wort,2L);
  1082.    while((wort!=0xFFFF)&&(hd->MenuPageCount<=hd->MaxItems))
  1083.     {
  1084.      hd->MenuPages[hd->MenuPageCount]=wort;
  1085.      hd->MenuPageCount++;
  1086.      CacheRead(hd,&wort,2L);
  1087.     }
  1088.    for(j=0;j<hd->MenuPageCount;j++)
  1089.     {
  1090.      if(hd->MenuPages[j]!=2000)
  1091.       {
  1092.        GetTitle(hd,hd->MenuPages[j]);
  1093.        if((strlen(&hd->String))>59) hd->String[59]=0x00;
  1094.        strcpy(&hd->MenuNames[j],&hd->String);
  1095.       }
  1096.     }
  1097.   }
  1098. }
  1099.  
  1100.  
  1101. /* Textseite anzeigen */
  1102. VOID ShowTextPage(hd,num)
  1103.  struct HelpData *hd;
  1104.  UWORD            num;
  1105. {
  1106.  REGISTER UWORD  i,j;
  1107.  
  1108.  hd->CurrentLine=0xFFFF;
  1109.  hd->LineCount=0;
  1110.  
  1111.  j=LENGTH(num);
  1112.  CacheSeek(hd,TOFFSET(num),OFFSET_BEGINNING);
  1113.  CacheRead(hd,hd->Memory,j);
  1114.  
  1115.  i=0;
  1116.  while(i<j)
  1117.  {
  1118.   hd->Lines[hd->LineCount]=&hd->Memory[i];
  1119.   i+=(strlen(&hd->Memory[i])+1);
  1120.   hd->LineCount++;
  1121.  }
  1122.  
  1123.  ShowPart(hd,0);
  1124.  
  1125.  if(hd->LineCount>hd->Rows)
  1126.    hd->PropBody=hd->LineCount-hd->Rows;
  1127.  else
  1128.    hd->PropBody=1;
  1129.  NewProp(hd,hd->PropBody);
  1130.  
  1131.  WindowToFront(hd->TextWindow);
  1132.  
  1133.  RefreshGadWindow(hd,TRUE);
  1134.  GetPictures(hd,num);
  1135.  GetItems(hd,num);
  1136.  MakeMenu(hd);
  1137. }
  1138.  
  1139.  
  1140. /* Textteil auflisten */
  1141. VOID ShowPart(hd,part)
  1142.  struct HelpData *hd;
  1143.  UWORD            part;
  1144. {
  1145.  UBYTE          s[6];
  1146.  REGISTER BYTE  test;
  1147.  REGISTER UWORD i,j,k;
  1148.  
  1149.  if(part==hd->CurrentLine) return;
  1150.  
  1151.  ConWrite(hd,"\x9b0;33;40m");
  1152.  if(!(hd->LineCount<=hd->Rows))
  1153.   {
  1154.    if(part>(hd->LineCount-hd->Rows)) part=hd->LineCount-hd->Rows;
  1155.  
  1156.    /*  part            = Zeile, ab der gelistet werden soll
  1157.        hd->CurrentLine = Zeile, ab der gelistet wird          */
  1158.  
  1159.    if(part>hd->CurrentLine)
  1160.      { test=3; if(part-hd->CurrentLine>=hd->ListRows) test=1; }
  1161.    else if(part<hd->CurrentLine)
  1162.      { test=4; if(hd->CurrentLine-part>=hd->ListRows) test=1; }
  1163.    else
  1164.      { test=1; }
  1165.  
  1166.    switch(test)
  1167.     {
  1168.      case 1:
  1169.        hd->CurrentLine=part;
  1170.        ConWrite(hd,"\f");
  1171.        for(i=part;i<part+hd->Rows;i++)
  1172.         {
  1173.          ConWrite(hd,hd->Lines[i]);
  1174.          ConWrite(hd,"\n");
  1175.         }
  1176.       break;
  1177.      case 3:
  1178.        j=part-hd->CurrentLine;
  1179.        k=hd->CurrentLine+hd->Rows;
  1180.        for(i=k;i<(k+j);i++)
  1181.         {
  1182.          ConWrite(hd,hd->Lines[i]);
  1183.          ConWrite(hd,"\n");
  1184.         }
  1185.        hd->CurrentLine+=j;
  1186.       break;
  1187.      case 4:
  1188.        j=hd->CurrentLine-part;
  1189.        k=hd->CurrentLine;
  1190.        ConWrite(hd,"\x9b");
  1191.        ConWrite(hd,"H");
  1192.        for(i=(k-j);i<k;i++)
  1193.         {
  1194.          ConWrite(hd,"\x9b");
  1195.          ConWrite(hd,"L");
  1196.          ConWrite(hd,hd->Lines[i]);
  1197.          ConWrite(hd,"\n");
  1198.         }
  1199.        sprintf(&s,"%ldH",(hd->Rows+1));
  1200.        ConWrite(hd,"\x9b");
  1201.        ConWrite(hd,&s);
  1202.        ConWrite(hd,"\x9b");
  1203.        ConWrite(hd,"M");
  1204.        hd->CurrentLine-=j;
  1205.       break;
  1206.     }
  1207.   }
  1208.  else
  1209.   {
  1210.    ConWrite(hd,"\f");
  1211.    for(i=0;i<hd->LineCount;i++)
  1212.     {
  1213.      ConWrite(hd,hd->Lines[i]);
  1214.      ConWrite(hd,"\n");
  1215.     }
  1216.   }
  1217. }
  1218.  
  1219.  
  1220. /* Index-Gadgets entfernen */
  1221. VOID RemIndexGadgets(hd)
  1222.  struct HelpData *hd;
  1223. {
  1224.  REGISTER UBYTE          i;
  1225.  register struct Gadget *gad;
  1226.  
  1227.  if(hd->IndexWindow->UserData!=NULL)
  1228.   {
  1229.    for(i=0;i<64;i++)
  1230.     {
  1231.      gad=hd->IndexGadgets[i];
  1232.      if(gad!=NULL)
  1233.       {
  1234.        RemoveGadget(hd->IndexWindow,gad);
  1235.        hd->IndexGadgets[i]=NULL;
  1236.        hd->IndexGadgetPages[i]=0;
  1237.       }
  1238.     }
  1239.    FreeRemember(&hd->IndexWindow->UserData,TRUE);
  1240.    hd->IndexWindow->UserData=NULL;
  1241.   }
  1242.  SetAPen(hd->IndexRastPort,0);
  1243.  RectFill(hd->IndexRastPort,0,0,582,hd->IndexWindowHeight);
  1244. }
  1245.  
  1246.  
  1247. /* Proportionalgadget verändern */
  1248. VOID NewProp(hd,v)
  1249.  struct HelpData *hd;
  1250.  UWORD            v;
  1251. {
  1252.  
  1253.  ModifyProp(hd->PropGadget,hd->MainWindow,NULL,
  1254.             AUTOKNOB|PROPBORDERLESS|FREEVERT,0,0,0,65535/v);
  1255. }
  1256.  
  1257.  
  1258. /* Menüleiste erstellen */
  1259. VOID MakeMenu(hd)
  1260.  struct HelpData *hd;
  1261. {
  1262.  REGISTER UWORD i,j;
  1263.  
  1264.  RemoveMenuStrip(hd->MenuStrip,FALSE);
  1265.  hd->DateiMenu=AddMenu(hd->MenuStrip,"Datei",5,150);
  1266.  AddItem(hd->MenuStrip,"Einstellunden ändern",300,'E',TRUE,TRUE);
  1267.  AddItem(hd->MenuStrip,GetOpalLine(),300,0,FALSE,FALSE);
  1268.  AddItem(hd->MenuStrip,"Bedienungshinweise",300,'B',TRUE,TRUE);
  1269.  AddItem(hd->MenuStrip,"Statistik",300,'S',TRUE,TRUE);
  1270.  AddItem(hd->MenuStrip,"Testseite",300,'T',TRUE,TRUE);
  1271.  AddItem(hd->MenuStrip,GetOpalLine(),300,0,FALSE,FALSE);
  1272.  AddItem(hd->MenuStrip,"Informationen zum Programm",300,'I',TRUE,TRUE);
  1273.  AddItem(hd->MenuStrip,GetOpalLine(),300,0,FALSE,FALSE);
  1274.  AddItem(hd->MenuStrip,"Hilfe beenden",300,'Q',TRUE,TRUE);
  1275.  hd->QVMenu=AddMenu(hd->MenuStrip,"Querverweise",160,150);
  1276.  if(hd->MenuPageCount>0)
  1277.   {
  1278.    for(i=0;i<hd->MenuPageCount;i++)
  1279.     {
  1280.      if(hd->MenuPages[i]!=2000)
  1281.       {
  1282.        MacFormat(hd->MainRastPort,&hd->MenuNames[i],430);
  1283.        AddItem(hd->MenuStrip,&hd->MenuNames[i],450,0,TRUE,TRUE);
  1284.       }
  1285.      else AddItem(hd->MenuStrip,GetOpalLine450(),450,0,FALSE,FALSE);
  1286.     }
  1287.   }
  1288.  else AddItem(hd->MenuStrip,"Nicht verfügbar",300,0,TRUE,FALSE);
  1289.  hd->BilderMenu=AddMenu(hd->MenuStrip,"Bilder",315,150);
  1290.  if(hd->MenuPicCount>0)
  1291.   {
  1292.    for(i=0;i<hd->MenuPicCount;i++)
  1293.     {
  1294.      if(hd->MenuPics[i]!=200)
  1295.       {
  1296.        sprintf(&hd->MenuPicNames[i],"Abbildung #%ld",hd->MenuPics[i]+1);
  1297.        AddItem(hd->MenuStrip,&hd->MenuPicNames[i],300,0,TRUE,TRUE);
  1298.       }
  1299.      else AddItem(hd->MenuStrip,GetOpalLine(),300,0,FALSE,FALSE);
  1300.     }
  1301.   }
  1302.  else AddItem(hd->MenuStrip,"Nicht verfügbar",300,0,TRUE,FALSE);
  1303.  UseMenuStrip(hd->MenuStrip);
  1304.  ActivateWindow(hd->MainWindow);
  1305. }
  1306.  
  1307.  
  1308. UBYTE *HString[]=
  1309. {
  1310.  "",
  1311.  "\x9b1;33;40m\x9b4;33;40mDie Bedienung des Online-Hilfesystems\x9b0;33;40m",
  1312.  "",
  1313.  "",
  1314.  "",
  1315.  "\x9b4;33;40mDie Auswahl von Seiten\x9b0;33;40m",
  1316.  "",
  1317.  "",
  1318.  "Beim Aufruf des Hilfesystems wird zuerst der Hauptindex geladen. Durch",
  1319.  "Klicken auf die Gadgets im Index gelangt man zu den entsprechenden",
  1320.  "Seiten.",
  1321.  "",
  1322.  "Am unteren Bildschirmrand befindet sich mindestens ein Gadget; maximal",
  1323.  "jedoch sechs. Mit ihnen kann zur nächsten bzw. vorhergehenden Seite ge-",
  1324.  "wechselt werden oder die zuletzt angezeigten Seiten erneut sichten.",
  1325.  "",
  1326.  "Gadget-Positionen und ihre Funktionen",
  1327.  "",
  1328.  "[«] [......] [......] [......] [......] [»]",
  1329.  " |     |        |        |        |      |",
  1330.  " |     |        |        |        |      +-- Umkehrung von \"«\"",
  1331.  " |     |        |        |        +-- nächste Indexseite",
  1332.  " |     |        |        +-- nächste Textseite",
  1333.  " |     |        +-- vorhergehende Textseite",
  1334.  " |     +-- vorhergehende Indexseite",
  1335.  " +-- zuletzt gezeigte Seite sichten",
  1336.  "",
  1337.  "",
  1338.  "",
  1339.  "\x9b4;33;40mDie Seitentypen\x9b0;33;40m",
  1340.  "",
  1341.  "",
  1342.  "Indexseiten:",
  1343.  "",
  1344.  "Auf Indexseiten befinden sich Gadgets, die zu den entsprechenden Text-",
  1345.  "seiten führen.",
  1346.  "",
  1347.  "",
  1348.  "Textseiten:",
  1349.  "",
  1350.  "Auf diesen Seiten stehen die Hilfstexte. Ist der Text größer als der",
  1351.  "im Textfenster zur Verfügung stehende Platz, so läßt sich der Text-",
  1352.  "ausschnitt mit dem Proportional-Gadget am rechten Bildschirmrand ver-",
  1353.  "schieben.",
  1354.  "",
  1355.  "Besitzt die Seite Querverweise auf andere Seiten, so sind diese im",
  1356.  "Menü \"Querverweise\" aufgelistet. Durch Anwahl des entsprechenden",
  1357.  "Menüpunktes wird die Seite geladen.",
  1358.  "Gleiches gilt für Bilder und Diagramme im Menü \"Bilder\".",
  1359.  "",
  1360.  "",
  1361.  "",
  1362.  "\x9b4;33;40mDas Datei-Menü\x9b0;33;40m",
  1363.  "",
  1364.  "",
  1365.  "Der Menüpunkt \"Einstellungen ändern\"",
  1366.  "",
  1367.  "Hier lassen sich die Grundeinstellungen des Hilfesystems ändern:",
  1368.  "",
  1369.  "Cache-Modus: Die Hilfedatei wird beim Start komplett in den Haupt-",
  1370.  "             speicher geladen. Bei Systemen mit wenig Speicher kann",
  1371.  "             der Modus ausgeschaltet werden. Bei jeder neuen Seite",
  1372.  "             wird dann vom Datenträger nachgeladen.",
  1373.  "",
  1374.  "PAL-Modus: Es wird statt des amerikanischen NTSC-Videosystems",
  1375.  "           (600x200 Pixel) das europäische PAL-System (640x256 Pixel)",
  1376.  "           benutzt.",
  1377.  "",
  1378.  "Interlace: Die Auflösung wird mit Hilfe des Interlace-Systems ver-",
  1379.  "           doppelt: 640x512 Pixel im PAL-Modus, 640x400 Pixel im NTSC-",
  1380.  "           Modus. Dies ist besonders im NTSC-Modus sinnvoll, da bei",
  1381.  "           ihm die Höhe des Bildschirms mit 200 Zeilen sehr gering ist.",
  1382.  "           Für des Interlace-Modus ist eine Flickerfixer-Karte sehr",
  1383.  "           empfehlenswert!",
  1384.  "",
  1385.  "Seitennummern: Zusätzlich zum Seitentitel wird auch die Seitennummer",
  1386.  "               angezeigt. Über diese Nummern läuft die gesamte Seiten-",
  1387.  "               verwaltung; deshalb kann diese Funktion beim Einbau der",
  1388.  "               Online-Hilfe in eigene Programme sinnvoll sein. Für den",
  1389.  "               normalen Gebrauch werden diese Nummern nicht benötigt,",
  1390.  "               da die Seitenauswahl über die Maus läuft.",
  1391.  "",
  1392.  "SN-Eingabe: Ist diese Funktion eingeschaltet, so kann eine Seitennummer",
  1393.  "            direkt eingegeben werden: Wurde die erste Ziffer gedrückt,",
  1394.  "            so erscheint rechts oben neben dem Index-Gadget statt der",
  1395.  "            Seitentitelanzeige die Nummerneingabeanzeige. Die direkte",
  1396.  "            Seiteneingabe ist wie auch die Seitennummernanzeige nur",
  1397.  "            für Entwicklungszwecke gedacht und wird deshalb bei Nor-",
  1398.  "            malgebrauch nicht benötigt.",
  1399.  "",
  1400.  "",
  1401.  "Der Menüpunkt \"Bedienungshinweise\"",
  1402.  "",
  1403.  "Hiermit wird dieser Text angezeigt.",
  1404.  "",
  1405.  "",
  1406.  "Der Menüpunkt \"Informationen zum Programm\"",
  1407.  "",
  1408.  "Hiermit werden Informationen über das Hilfesystem, die Version und",
  1409.  "den noch freien Speicher im Amiga und auf einer eventuell vorhan-",
  1410.  "denen PC/AT-Brückenkarte angezeigt.",
  1411.  "",
  1412.  "",
  1413.  "Der Menüpunkt \"Hilfe beenden\"",
  1414.  "",
  1415.  "Hiermit wird das Hilfesystem geschlossen und in das Anwendungs-",
  1416.  "programm zurückgekehrt, von welchem das Hilfesystem aufgerufen",
  1417.  "wurde.",
  1418.  "",
  1419.  "",
  1420.  "",
  1421.  "\x9b4;33;40mDas Querverweise-Menü\x9b0;33;40m",
  1422.  "",
  1423.  "In diesem Menü stehen Querverweise auf andere, zum Thema relevante",
  1424.  "Seiten. Sie können durch Anwahl des entsprechendes Menüpunktes",
  1425.  "gesichtet werden. Querverweise sind nicht auf allen Seiten.",
  1426.  "",
  1427.  "",
  1428.  "",
  1429.  "\x9b4;33;40mDas Bilder-Menü\x9b0;33;40m",
  1430.  "",
  1431.  "In diesem Menü befinden sich Bilder, die durch Anwahl der Menüpunkte",
  1432.  "angezeigt werden. Bilder sind, wie Querverweise, nicht auf allen",
  1433.  "Seiten.",
  1434.  "",
  1435.  "",
  1436.  "",
  1437.  "\x9b4;33;40mProgrammänderungen\x9b0;33;40m",
  1438.  "",
  1439.  " - Die Steuerung läuft nicht mehr über Seitennummern; sie werden",
  1440.  "   intern verwaltet, der Benutzer sieht stattdessen den Titel der",
  1441.  "   Seite und muß sich keine Nummern mehr merken",
  1442.  "",
  1443.  " - Die Seitenanwahl geschieht komplett mit der Maus:",
  1444.  "   Gadgets und Menüs verweisen auf die Seiten",
  1445.  "",
  1446.  " - Die Verwaltung der Wechselgadgets im unteren Bildschirmrand wird",
  1447.  "   komplett vom Programm verwaltet und nicht, wie bei Version 1.0,",
  1448.  "   durch Angaben des Hilfedatei-Autors",
  1449.  "",
  1450.  " - Unterstützung des amerikanischen NTSC-Modus",
  1451.  "",
  1452.  " - Unterstützung des Interlace-Modus",
  1453.  "",
  1454.  " - Textseiten können bis zu 2000 Zeilen haben, die Position kann mit",
  1455.  "   dem Proportional-Gadget gegebenenfalls geändert werden",
  1456.  "",
  1457.  " - Möglichkeit zur Anzeige von IFF-ILBM Grafiken",
  1458.  "",
  1459.  " - Durch den Cache für die Hilfedatei entfällt der Zugriff auf den",
  1460.  "   Datenträger vor jedem Anzeigen einer Seite",
  1461.  "",
  1462.  " - Möglichkeit der Textgestaltung durch ANSI-Textstyles",
  1463.  "",
  1464.  " - Das Hilfesystem ist jetzt nicht mehr Teil der ATUtilities-",
  1465.  "   Library, sondern ein normales Programm, das durch CLI/Shell",
  1466.  "   gestartet werden kann. Die Help()-Funktion der Library ist",
  1467.  "   entsprechend modifiziert worden und ruft jetzt das Hilfesystem",
  1468.  "   als Programm auf.",
  1469.  "   Vorteil: Nach dem Aufruf durch eine Anwendung wird sofort nach",
  1470.  "            dem Start wieder zum Programm zurückgekehrt; das Hilfe-",
  1471.  "            system ist jetzt ein eigener Task.",
  1472.  "",
  1473.  " - Die Seitenanzeige geschieht - unsichtbar für den Benutzer - in",
  1474.  "   vier verschiedenen Fenstern:",
  1475.  "    - Das Hauptfenster mit den Oberen Gadgets und dem Proportional-",
  1476.  "      Gadget liegt im Hintergrund.",
  1477.  "    - Das Textfenster wird nur bei Textseiten in den Vordergrund",
  1478.  "      geholt; es wird über das Console-Device verwaltet.",
  1479.  "    - Das Indexfenster wird nur bei Indexseiten in den Vordergrund",
  1480.  "      geholt; es enthält die Index-Gadgets.",
  1481.  "    - Das Wechselgadget-Fenster enthält die unteren Gadgets und ist",
  1482.  "      auch nur für diese zuständig.",
  1483.  "   Alle Fenster sind Rahmenlos; der Benutzer hat den Eindruck, die",
  1484.  "   gesamte Oberfläche bestünde aus einem Bildschirm.",
  1485.  "",
  1486.  " - Neues Hilfedateiformat",
  1487.  "",
  1488.  " - Integrierte Testseite, die über alle ANSI-Styles auskunft gibt",
  1489.  "",
  1490.  " - Die Bedienungshinweise wurden stark erweitert und sind jetzt",
  1491.  "   wesentlich ausführlicher",
  1492.  "",
  1493.  " - Statistikfunktion, die Über Seiten und Bilder Auskunft gibt",
  1494.  NULL
  1495. };
  1496.  
  1497. UBYTE *TString[]=
  1498. {
  1499.  "",
  1500.  "\x9b4;33;40mTestseite für das \x9b1;33;40mOnline-Help-System\x9b0;33;40m",
  1501.  "",
  1502.  "",
  1503.  "Diese Seite dient dazu, die gestalterischen Möglichkeiten aufzuzeigen,",
  1504.  "die mit diesem System möglich sind:",
  1505.  "",
  1506.  " - \x9b4;33;40mUnterstreichen\x9b;0;33;40m",
  1507.  " - \x9b1;33;40mFettdruck\x9b;0;33;40m",
  1508.  " - \x9b3;33;40mKursiv\x9b;0;33;40m",
  1509.  " - \x9b4;33;40mInvers\x9b;0;33;40m",
  1510.  " - F\x9b0;34;40ma\x9b0;35;40mr\x9b0;36;40mb\x9b0;37;40me\x9b0;38;40mn\x9b0;33;40m",
  1511.  " - \x9b0;35;40mund \x9b1;36;40mnatürlich \x9b3;37;40mauch \x9b4;34;40m\x9b3;34;40mKombinationen\x9b0;33;40m"
  1512.  "",
  1513.  "",
  1514.  "\x9b0;37;40m[\x9b0;35;40m------------- \x9b1;33;40m72 Zeichen\x9b0;35;40m ---------------------------------------------\x9b0;37;40m]\x9b0;33;40m",
  1515.  
  1516.  "",
  1517.  "",
  1518.  "\x9b1;33;40mWeitere Informationen zur Programmierung des Hilfesystems finden Sie",
  1519.  "in der Dokumentation der ATUtilities-Library!\x9b0;33;40m",
  1520.  "",
  1521.  "",
  1522.  NULL
  1523. };
  1524.  
  1525. UBYTE *Test=" \x9b%d;%d;%dmFarbe %d: ABCEFGHIJKLMNOPQRSTUVWXYZ abcdefghijhklmnopqrstuvwxyz\x9b0;33;40m";
  1526.  
  1527. VOID Out(hd,text,a,b,c,d,e)
  1528.  struct HelpData *hd;
  1529.  UBYTE           *text;
  1530.  ULONG            a,b,c,d,e;
  1531. {
  1532.  
  1533.  sprintf(&hd->Memory[hd->OutputPos],text,a,b,c,d,e);
  1534.  hd->Lines[hd->LineCount]=&hd->Memory[hd->OutputPos];
  1535.  hd->LineCount++;
  1536.  hd->OutputPos+=strlen(&hd->Memory[hd->OutputPos])+2;
  1537. }
  1538.  
  1539.  
  1540. /* Sonderseiten */
  1541. VOID SpecialPage(hd,num)
  1542.  struct HelpData *hd;
  1543.  UBYTE            num;
  1544. {
  1545.  ULONG           o;
  1546.  UBYTE           byte;
  1547.  REGISTER UBYTE  x;
  1548.  REGISTER ULONG  q;
  1549.  REGISTER UWORD  i,p;
  1550.  
  1551.  WindowToFront(hd->TextWindow);
  1552.  hd->Flags=PAGE_TEXT;
  1553.  hd->Page=1001;
  1554.  hd->LineCount=0;
  1555.  hd->OutputPos=0;
  1556.  hd->CurrentLine=0xFFFF;
  1557.  i=0;
  1558.  RefreshGadWindow(hd,FALSE);
  1559.  
  1560.  ConWrite(hd,"\x9b0;33;40m\f");
  1561.  switch(num)
  1562.   {
  1563.    case 1:
  1564.      DrawMNTextBorder(hd->MainWindow,320,10,310,12,"Testseite");
  1565.      while(TString[i]!=NULL)
  1566.       {
  1567.        hd->Lines[i]=TString[i];
  1568.        i++;
  1569.       }
  1570.      hd->LineCount=i;
  1571.      for(p=0;p<5;p++)
  1572.       {
  1573.        Out(hd,"");
  1574.        for(i=0;i<=7;i++)
  1575.         {
  1576.          if(i==0) x=41; else x=40;
  1577.          Out(hd,Test,st[p],i+30,x,i);
  1578.         }
  1579.       }
  1580.     break;
  1581.    case 2:
  1582.      DrawMNTextBorder(hd->MainWindow,320,10,310,12,"Statistik");
  1583.      ConWrite(hd,"\n\n\n\n\nStatistik wird erstellt...\n");
  1584.      Out(hd,Statistik[0]);
  1585.      Out(hd,Statistik[3]);
  1586.      Out(hd,Statistik[0]);
  1587.      Out(hd,Statistik[0]);
  1588.      Out(hd,Statistik[4]);
  1589.      Out(hd,Statistik[0]);
  1590.      Out(hd,Statistik[5]);
  1591.      p=0; q=0;
  1592.      for(i=0;i<1000;i++)
  1593.       {
  1594.        if(OFFSET(i)!=0)
  1595.         {
  1596.          GetTitle(hd,i);
  1597.          MacFormat(hd->TextRastPort,&hd->String,210);
  1598.          Out(hd,Statistik[6],(ULONG)i,(ULONG)OFFSET(i),(ULONG)LENGTH(i),Statistik[FLAGS(i)],(ULONG)&hd->String);
  1599.          p++; q+=LENGTH(i);
  1600.         }
  1601.       }
  1602.      Out(hd,Statistik[0]);
  1603.      Out(hd,Statistik[0]);
  1604.      Out(hd,Statistik[9],p);
  1605.      Out(hd,Statistik[10],q/1024);
  1606.      Out(hd,Statistik[0]);
  1607.      Out(hd,Statistik[0]);
  1608.      Out(hd,Statistik[7]);
  1609.      Out(hd,Statistik[0]);
  1610.      Out(hd,Statistik[0]);
  1611.      Out(hd,Statistik[8]);
  1612.      p=0; q=0;
  1613.      for(i=0;i<100;i++)
  1614.       {
  1615.        o=hd->Picture[i];
  1616.        if(o!=NULL)
  1617.         {
  1618.          CacheSeek(hd,o,OFFSET_BEGINNING);
  1619.          CacheRead(hd,&byte,1);
  1620.          if(byte==0)
  1621.            Out(hd,Statistik[11],i,hd->Picture[i]);
  1622.          else
  1623.           {
  1624.            CacheRead(hd,&o,4L); q+=o;
  1625.            Out(hd,Statistik[12],i,hd->Picture[i],o);
  1626.           }
  1627.          p++;
  1628.         }
  1629.       }
  1630.      Out(hd,Statistik[0]);
  1631.      Out(hd,Statistik[0]);
  1632.      Out(hd,Statistik[13],p);
  1633.      Out(hd,Statistik[14],q/1024);
  1634.      ConWrite(hd,"\f");
  1635.     break;
  1636.    case 3:
  1637.      DrawMNTextBorder(hd->MainWindow,320,10,310,12,"Bedienungshinweise");
  1638.      while(HString[i]!=NULL)
  1639.       {
  1640.        hd->Lines[i]=HString[i];
  1641.        i++;
  1642.       }
  1643.      hd->LineCount=i;
  1644.     break;
  1645.   }
  1646.  
  1647.  ShowPart(hd,0);
  1648.  if(hd->LineCount>hd->Rows)
  1649.    hd->PropBody=hd->LineCount-hd->Rows;
  1650.  else
  1651.    hd->PropBody=1;
  1652.  NewProp(hd,hd->PropBody);
  1653.  RemIndexGadgets(hd);
  1654. }
  1655.  
  1656.  
  1657. /* Einstellungen ändern */
  1658. VOID Prefs(hd)
  1659.  struct HelpData *hd;
  1660. {
  1661.  REGISTER UWORD                i,j;
  1662.  register struct FileHandle   *fh;
  1663.  register struct Window       *win;
  1664.  register struct RastPort     *rp;
  1665.  register struct Gadget       *g1,*g2,*g3,*g4,*g5;
  1666.  
  1667.  win=CreateWindow(hd->Screen,"Online-Hilfe - Einstellungen",
  1668.                   75,75,450,105,
  1669.                   CLOSEWINDOW,
  1670.                   ACTIVATE|WINDOWDRAG|WINDOWCLOSE);
  1671.  if(win!=NULL)
  1672.   {
  1673.    win->UserData=NULL;
  1674.    rp=win->RPort;
  1675.    SetFont(rp,hd->OpalFont);
  1676.    if(hd->OHPrefs.Cache==0)
  1677.      g1=CreateNToggleGadget(win,15,15,410,12,"Cache für Hilfedatei anlegen",1);
  1678.    else
  1679.      g1=CreateSToggleGadget(win,15,15,410,12,"Cache für Hilfedatei anlegen",1);
  1680.    if(hd->OHPrefs.IsPAL==0)
  1681.      g4=CreateNToggleGadget(win,15,30,410,12,"Europäisches PAL-Videosystem",4);
  1682.    else
  1683.      g4=CreateSToggleGadget(win,15,30,410,12,"Europäisches PAL-Videosystem",4);
  1684.    if(hd->OHPrefs.Lace==0)
  1685.      g5=CreateNToggleGadget(win,15,45,410,12,"Höhere Auflösung durch Interlace-Modus",5);
  1686.    else
  1687.      g5=CreateSToggleGadget(win,15,45,410,12,"Höhere Auflösung durch Interlace-Modus",5);
  1688.    SetAPen(rp,3);
  1689.    WriteText(rp,20,67,"Spezialeinstellungen:");
  1690.    if(hd->OHPrefs.Numbers==0)
  1691.      g2=CreateNToggleGadget(win,15,72,410,12,"Anzeige mit Seitennummern",2);
  1692.    else
  1693.      g2=CreateSToggleGadget(win,15,72,410,12,"Anzeige mit Seitennummern",2);
  1694.    if(hd->OHPrefs.NumInput==0)
  1695.      g3=CreateNToggleGadget(win,15,87,410,12,"Direkte Seitennummereingabe",3);
  1696.    else
  1697.      g3=CreateSToggleGadget(win,15,87,410,12,"Direkte Seitennummereingabe",3);
  1698.    WaitPort(win->UserPort);
  1699.    ReplyMsg(GetMsg(win->UserPort));
  1700.    if(g1->Flags & SELECTED) hd->OHPrefs.Cache=1; else hd->OHPrefs.Cache=0;
  1701.    if(g2->Flags & SELECTED) hd->OHPrefs.Numbers=1; else hd->OHPrefs.Numbers=0;
  1702.    if(g3->Flags & SELECTED) hd->OHPrefs.NumInput=1; else hd->OHPrefs.NumInput=0;
  1703.    if(g4->Flags & SELECTED) hd->OHPrefs.IsPAL=1; else hd->OHPrefs.IsPAL=0;
  1704.    if(g5->Flags & SELECTED) hd->OHPrefs.Lace=1; else hd->OHPrefs.Lace=0;
  1705.    DeleteStdWindow(win);
  1706.    fh=Open(PrefsName,MODE_NEWFILE);
  1707.    if(fh!=NULL)
  1708.     {
  1709.      Write(fh,&hd->OHPrefs,sizeof(struct OHPrefs));
  1710.      Close(fh);
  1711.     }
  1712.   }
  1713. }
  1714.  
  1715.  
  1716. /* Read-Funktion für Cache */
  1717. LONG CacheRead(hd,mem,len)
  1718.  struct HelpData *hd;
  1719.  UBYTE           *mem;
  1720.  ULONG            len;
  1721. {
  1722.  
  1723.  if(hd->CacheOn==0)
  1724.   {
  1725.    return(Read(hd->HelpFile,mem,len));
  1726.   }
  1727.  
  1728.  CopyMem(&hd->CacheMemory[hd->CachePos],mem,len);
  1729.  hd->CachePos+=len;
  1730.  return(len);
  1731. }
  1732.  
  1733.  
  1734. /* Seek-Funktion für Cache */
  1735. LONG CacheSeek(hd,pos,offset)
  1736.  struct HelpData *hd;
  1737.  LONG             pos;
  1738.  LONG             offset;
  1739. {
  1740.  
  1741.  if(hd->CacheOn==0)
  1742.   {
  1743.    return(Seek(hd->HelpFile,pos,offset));
  1744.   }
  1745.  
  1746.  hd->CacheLastPos=hd->CachePos;
  1747.  switch(offset)
  1748.   {
  1749.    case OFFSET_BEGINNING:
  1750.      hd->CachePos=pos;
  1751.     break;
  1752.    case OFFSET_END:
  1753.      hd->CachePos=hd->CacheSize+pos;
  1754.     break;
  1755.   }
  1756.  return(hd->CacheLastPos);
  1757. }
  1758.  
  1759.  
  1760. /* IFF-Bild zeigen */
  1761. VOID LoadAPicture(hd,num)
  1762.  struct HelpData *hd;
  1763.  UBYTE            num;
  1764. {
  1765.  LONG                        o;
  1766.  ULONG                       size;
  1767.  UBYTE                       byte;
  1768.  REGISTER BOOL               bool;
  1769.  REGISTER UBYTE             *mem;
  1770.  register struct FileHandle *fh;
  1771.  
  1772.  o=hd->Picture[num];
  1773.  if(o!=NULL)
  1774.   {
  1775.    CacheSeek(hd,o,OFFSET_BEGINNING);
  1776.    CacheRead(hd,&byte,1L);
  1777.    if(byte==0)
  1778.     {
  1779.      CacheRead(hd,&hd->String,199);
  1780.      hd->String[199]=0x00;
  1781.      bool=ShowPicture(&hd->String);
  1782.      if(bool==FALSE)
  1783.        MultiRequest("Bild kann nicht geladen werden:",&hd->String,"Okay",0L);
  1784.     }
  1785.    else
  1786.     {
  1787.      CacheRead(hd,&size,4L);
  1788.      if(hd->CacheOn!=0)
  1789.       {
  1790.        DisplayPicture(&hd->CacheMemory[hd->CachePos],size);
  1791.       }
  1792.      else
  1793.       {
  1794.        mem=AllocMem(size,MEMF_CLEAR|MEMF_PUBLIC);
  1795.        if(mem!=NULL)
  1796.         {
  1797.          CacheRead(hd,mem,size);
  1798.          DisplayPicture(mem,size);
  1799.          FreeMem(mem,size);
  1800.         }
  1801.       }
  1802.     }
  1803.   }
  1804. }
  1805.  
  1806.  
  1807. /* Seite in Seitenliste einfügen */
  1808. VOID AddPage(hd)
  1809.  struct HelpData *hd;
  1810. {
  1811.  REGISTER UBYTE i;
  1812.  
  1813.  if((hd->LastPagePos>0)&&(hd->Page==hd->LastPage[hd->LastPagePos-1])) return;
  1814.  
  1815.  hd->ShowLastPageBack=0;
  1816.  hd->LastPageSelect=hd->LastPagePos;
  1817.  if(hd->LastPagePos<PAGE_MEMORY)
  1818.   {
  1819.    hd->LastPage[hd->LastPagePos]=hd->Page;
  1820.    hd->LastPagePos++;
  1821.   }
  1822.  else
  1823.   {
  1824.    for(i=0;i<PAGE_MEMORY;i++)
  1825.     {
  1826.      hd->LastPage[i]=hd->LastPage[i+1];
  1827.     }
  1828.    hd->LastPage[PAGE_MEMORY-1]=hd->Page;
  1829.    hd->LastPageSelect=PAGE_MEMORY-1;
  1830.   }
  1831. }
  1832.  
  1833.